package com.zzyl.exception;

import cn.hutool.core.util.ObjectUtil;
import com.zzyl.base.ResponseResult;
import com.zzyl.enums.BasicEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
	/**
	 * 捕获数据库违反唯一约束异常
	 * @param exception
	 * @return
	 */
	@ExceptionHandler(DuplicateKeyException.class)
	public ResponseResult<Object> handleBaseException(DuplicateKeyException exception) {
		String errorMessage = exception.getMessage();
		// 根据异常信息判断具体的约束违反情况
		if (errorMessage.contains("Duplicate entry")) {
			return ResponseResult.error(BasicEnum.DB_DUPLICATE_INSERT_FAIL);
		}
		return ResponseResult.error(BasicEnum.DB_OTHER_FAIL);
	}
	
	/**
	 * 处理自定义异常BaseException。
	 * 返回自定义异常中的错误代码和错误消息。
	 * @param exception 自定义异常
	 * @return 响应数据，包含错误代码和错误消息
	 */
	@ExceptionHandler(BaseException.class)
	public ResponseResult<Object> handleBaseException(BaseException exception) {
		exception.printStackTrace();
		if (ObjectUtil.isNotEmpty(exception.getBasicEnum())) {
			log.error("自定义异常处理:{}", exception.getBasicEnum().getMsg());
		}
		return ResponseResult.error(exception.getBasicEnum());
	}
	
	/**
	 * 处理其他未知异常。
	 * 返回HTTP响应状态码500，包含错误代码和异常堆栈信息。
	 */
	@ExceptionHandler(Exception.class)
	public ResponseResult<String> handlerDefaultError(Exception ex) {
		//打印异常到控制台
		ex.printStackTrace();
		//响应数据
		return ResponseResult.error(ex.getMessage());
	}
	
}
